#!/usr/bin/env python3
"""
RedFire 市场数据服务启动脚本 - V2重构版本
============================================

基于插件化适配器架构的市场数据服务启动脚本

架构特点：
- 完全配置驱动的适配器加载
- 依赖注入模式
- 插件化架构
- 完全解耦的服务设计

作者: 架构组
版本: v2.0
更新日期: 2025-10-05
"""

import sys
import os
import subprocess
from pathlib import Path
import argparse

# 设置路径
project_root = Path(__file__).parent.parent.parent.parent
sys.path.insert(0, str(project_root))


def print_banner():
    """打印启动横幅"""
    print("=" * 80)
    print("🔥 RedFire 市场数据服务 V2 - 启动器")
    print("=" * 80)
    print("架构版本: V2 (插件化适配器架构)")
    print("服务版本: 2.0.0")
    print("=" * 80)
    print()


def check_dependencies():
    """检查必要的依赖"""
    print("🔍 检查依赖...")
    
    missing_deps = []
    
    # 检查核心依赖
    try:
        import fastapi
        print("  ✅ FastAPI")
    except ImportError:
        missing_deps.append("fastapi")
        print("  ❌ FastAPI")
    
    try:
        import uvicorn
        print("  ✅ Uvicorn")
    except ImportError:
        missing_deps.append("uvicorn")
        print("  ❌ Uvicorn")
    
    try:
        from dotenv import load_dotenv
        print("  ✅ python-dotenv")
    except ImportError:
        missing_deps.append("python-dotenv")
        print("  ❌ python-dotenv")
    
    # 检查RedFire框架
    try:
        from backend.redfire_framework.core import RedFireMicroservice
        print("  ✅ RedFire Framework")
    except ImportError:
        missing_deps.append("redfire-framework")
        print("  ❌ RedFire Framework")
    
    if missing_deps:
        print(f"\n❌ 缺少以下依赖: {', '.join(missing_deps)}")
        print("💡 请运行: pip install -r requirements.txt")
        return False
    
    print("✅ 所有依赖检查通过\n")
    return True


def check_configuration():
    """检查配置文件"""
    print("🔍 检查配置...")
    
    service_dir = Path(__file__).parent
    config_dir = service_dir / "config"
    
    # 检查配置文件
    config_files = {
        "service_config.py": config_dir / "service_config.py",
        "development.env": config_dir / "development.env",
        "config.env.template": service_dir / "config.env.template"
    }
    
    all_exist = True
    for name, path in config_files.items():
        if path.exists():
            print(f"  ✅ {name}")
        else:
            print(f"  ⚠️  {name} (不存在)")
            if name == "development.env":
                print(f"     💡 提示: 可以从 config.env.template 复制")
            all_exist = False
    
    if not all_exist:
        print("\n⚠️  部分配置文件缺失，服务可能无法正常启动")
        return False
    
    print("✅ 配置文件检查通过\n")
    return True


def test_service_import():
    """测试服务导入"""
    print("🔍 测试服务导入...")
    
    try:
        # 测试主应用导入
        from backend.services.market_data_service.app.main import app
        print("  ✅ FastAPI应用")
        
        # 测试核心组件导入
        from backend.services.market_data_service.app.adapters.manager import AdapterManager
        print("  ✅ AdapterManager")
        
        from backend.services.market_data_service.app.services.core.market_data_service_v2 import MarketDataServiceV2
        print("  ✅ MarketDataServiceV2")
        
        from backend.services.market_data_service.app.services.core.influxdb_writer_service import InfluxDBWriterService
        print("  ✅ InfluxDBWriterService")
        
        from backend.services.market_data_service.config.service_config import get_config
        print("  ✅ ServiceConfig")
        
        print("✅ 服务导入测试通过\n")
        return True
        
    except Exception as e:
        print(f"❌ 服务导入失败: {e}")
        import traceback
        traceback.print_exc()
        return False


def show_service_info():
    """显示服务信息"""
    print("📋 服务信息:")
    print("-" * 80)
    
    try:
        from backend.services.market_data_service.config.service_config import get_config
        config = get_config()
        
        print(f"服务名称: {config.service_name}")
        print(f"服务版本: {config.service_version}")
        print(f"API端口: {config.api_port}")
        print(f"环境: {config.environment}")
        print()
        print("数据库配置:")
        print(f"  - InfluxDB: {config.database.influxdb_url}")
        print(f"  - Redis: {config.database.redis_url}")
        print()
        print("适配器配置:")
        if hasattr(config, 'adapters') and config.adapters:
            for name, adapter_config in config.adapters.items():
                enabled = adapter_config.get('enabled', False)
                status = "✅ 启用" if enabled else "⏸️  禁用"
                print(f"  - {name}: {status}")
        else:
            print("  (未配置适配器)")
        
    except Exception as e:
        print(f"⚠️  无法读取配置: {e}")
    
    print("-" * 80)
    print()


def start_service(port: int = None, reload: bool = True, host: str = "0.0.0.0"):
    """启动服务"""
    print("🚀 启动市场数据服务 V2...\n")
    
    # 从配置读取端口（如果未指定）
    if port is None:
        try:
            from backend.services.market_data_service.config.service_config import get_config
            config = get_config()
            port = config.api_port
        except Exception:
            port = 8002  # 默认端口
    
    # 构建启动命令
    cmd = [
        'uvicorn',
        'backend.services.market_data_service.app.main:app',
        '--host', host,
        '--port', str(port),
    ]
    
    if reload:
        cmd.append('--reload')
    
    # 显示启动信息
    print("=" * 80)
    print(f"📡 启动命令: {' '.join(cmd)}")
    print()
    print(f"🌐 服务地址:")
    print(f"   - 本地访问: http://localhost:{port}")
    print(f"   - API文档: http://localhost:{port}/docs")
    print(f"   - 健康检查: http://localhost:{port}/health")
    print(f"   - 详细健康: http://localhost:{port}/health/detailed")
    print(f"   - 服务信息: http://localhost:{port}/info/service")
    print(f"   - 适配器信息: http://localhost:{port}/info/adapters")
    print(f"   - 监控指标: http://localhost:{port}/metrics")
    print()
    print(f"📦 V2 API端点:")
    print(f"   - 历史K线: http://localhost:{port}/api/v1/data/bars/historical")
    print(f"   - 实时Tick: http://localhost:{port}/api/v1/data/ticks/realtime")
    print(f"   - 订阅管理: http://localhost:{port}/api/v1/data/subscribe")
    print()
    print("💡 提示:")
    print("   - 按 Ctrl+C 停止服务")
    print("   - 使用 --help 查看更多选项")
    print("=" * 80)
    print()
    
    try:
        # 启动服务
        subprocess.run(cmd, cwd=project_root)
    except KeyboardInterrupt:
        print("\n🛑 服务已停止")
    except Exception as e:
        print(f"\n❌ 启动失败: {e}")
        return False
    
    return True


def show_architecture_info():
    """显示架构信息"""
    print("\n📐 V2架构特点:")
    print("-" * 80)
    print("1. 插件化适配器架构")
    print("   - 所有数据源作为独立插件")
    print("   - 通过配置文件动态加载")
    print("   - 支持热插拔（无需修改代码）")
    print()
    print("2. 配置驱动")
    print("   - 零代码切换数据源")
    print("   - 环境变量支持")
    print("   - 多环境配置")
    print()
    print("3. 依赖注入")
    print("   - 标准化的依赖管理")
    print("   - 松耦合设计")
    print("   - 易于测试")
    print()
    print("4. 标准化接口")
    print("   - 统一的适配器接口")
    print("   - 标准化的数据模型")
    print("   - 一致的错误处理")
    print()
    print("5. 性能优化")
    print("   - 批量写入（1000条/批）")
    print("   - 异步处理")
    print("   - 多级缓存")
    print("-" * 80)


def main():
    """主函数"""
    # 解析命令行参数
    parser = argparse.ArgumentParser(
        description="RedFire 市场数据服务 V2 启动器",
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        '--port', '-p',
        type=int,
        help='服务端口（默认从配置读取）'
    )
    parser.add_argument(
        '--host',
        type=str,
        default='0.0.0.0',
        help='服务主机地址（默认: 0.0.0.0）'
    )
    parser.add_argument(
        '--no-reload',
        action='store_true',
        help='禁用自动重载'
    )
    parser.add_argument(
        '--check-only',
        action='store_true',
        help='仅执行检查，不启动服务'
    )
    parser.add_argument(
        '--show-arch',
        action='store_true',
        help='显示架构信息'
    )
    
    args = parser.parse_args()
    
    # 打印横幅
    print_banner()
    
    # 显示架构信息（如果请求）
    if args.show_arch:
        show_architecture_info()
        return
    
    # 执行检查
    checks_passed = True
    
    if not check_dependencies():
        checks_passed = False
    
    if not check_configuration():
        checks_passed = False
    
    if not test_service_import():
        checks_passed = False
    
    if not checks_passed:
        print("\n❌ 检查未通过，请修复上述问题后重试")
        sys.exit(1)
    
    # 显示服务信息
    show_service_info()
    
    # 如果只是检查，到此结束
    if args.check_only:
        print("✅ 所有检查通过！")
        return
    
    # 询问是否启动
    print("准备启动服务...")
    choice = input("是否继续? (Y/n): ").strip().lower()
    
    if choice in ['', 'y', 'yes']:
        # 启动服务
        success = start_service(
            port=args.port,
            reload=not args.no_reload,
            host=args.host
        )
        
        if not success:
            sys.exit(1)
    else:
        print("👋 取消启动")


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n👋 退出启动器")
    except Exception as e:
        print(f"\n❌ 发生错误: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)